package com.gmadmin.mq.listener;

import cn.hutool.json.JSONUtil;
import com.gmadmin.entity.MqEntity;
import com.gmadmin.mq.template.CustomMessageTemplate;
import com.gmadmin.websocket.service.WsService;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;

/**
 * @author zhangliang
 * @version 1.0
 * @date 2022/7/28 19:05
 */
@RocketMQMessageListener(
        consumerGroup = "${rocketmq.namespace}%${rocketmq.consumer-notify.group}"  // 消费组，格式：namespace全称%group名称
        // 需要使用topic全称，所以进行topic名称的拼接，也可以自己设置  格式：namespace全称%topic名称
        , topic = "${rocketmq.namespace}%${rocketmq.consumer-notify.topic}"
        , selectorExpression = "${rocketmq.consumer-notify.subExpression}"
        , tlsEnable = "${rocketmq.consumer-notify.tlsEnable}" // 订阅表达式, 不配置表示订阅所有消息
)
@Service
public class RocketTestEntityMessageListener extends BaseMqMessageListener<MqEntity>
        implements RocketMQListener<MqEntity> {


    private final WsService wsService;

    protected RocketTestEntityMessageListener(CustomMessageTemplate customMessageTemplate, WsService wsService) {
        super(customMessageTemplate);
        this.wsService = wsService;
    }

    @Override
    protected String consumerName() {
        return "测试消费者";
    }

    /**
     * 业务消息处理
     *
     * @param message 待处理消息
     * @throws Exception
     */
    @Override
    protected void handleMessage(MqEntity message) throws Exception {
        // 此时这里才是最终的业务处理，代码只需要处理资源类关闭异常，其他的可以交给父类重试
        wsService.broadcastMsg(JSONUtil.toJsonStr(message));
    }

    /**
     * 当超过指定重试次数消息时此处方法会被调用
     * 生产中可以进行回退或其他业务操作
     *
     * @param message 待处理消息
     */
    @Override
    protected void overMaxRetryTimesMessage(MqEntity message) {
    }

    @Override
    protected boolean isRetry() {
        return false;
    }

    /**
     * 是否抛出异常，到消费异常时是被父类拦截处理还是直接抛出异常
     *
     * @return false
     */
    @Override
    protected boolean isThrowException() {

        return false;
    }

    /**
     * 获取到消息
     *
     * @param message
     */
    @Override
    public void onMessage(MqEntity message) {
        // 注意，此时这里没有直接处理业务，而是先委派给父类做基础操作，然后父类做完基础操作后会调用子类的实际处理类型
        super.dispatchMessage(message);
    }

    /**
     * 指定需要的重试次数，超过重试次数overMaxRetryTimesMessage会被调用
     *
     * @return
     */
    @Override
    protected int maxRetryTimes() {
        return 5;
    }
}
